From: Giovanni Campagna Date: Sat, 19 Jan 2013 01:22:15 +0000 (+0100) Subject: Workspace/WorkspaceThumbnail: fix Clutter warnings from stacking code X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~4450 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=ceae0321122ea31b6eca017cbf9440c3833a1260;p=gnome-shell.git Workspace/WorkspaceThumbnail: fix Clutter warnings from stacking code Windows can be restacked at any time, including when the stackAbove property of the window clone is being dragged, and thus parented to the uiGroup. To do stacking properly, we need to skip it for the duration of the drag, and sync it again at the end (which is already done by mutter because of the workspace change) https://bugzilla.gnome.org/show_bug.cgi?id=685285 --- diff --git a/js/ui/workspace.js b/js/ui/workspace.js index 3e954f4b3..e2e461d23 100644 --- a/js/ui/workspace.js +++ b/js/ui/workspace.js @@ -121,15 +121,33 @@ const WindowClone = new Lang.Class({ return this._slot; }, + // Find the actor just below us, respecting reparenting done + // by DND code + getActualStackAbove: function() { + if (this._stackAbove == null) + return null; + + if (this.inDrag || this._zooming) { + if (this._stackAbove._delegate) + return this._stackAbove._delegate.getActualStackAbove(); + else + return null; + } else { + return this._stackAbove; + } + }, + setStackAbove: function (actor) { this._stackAbove = actor; if (this.inDrag) // We'll fix up the stack after the drag return; - if (this._stackAbove == null) + + let actualAbove = this.getActualStackAbove(); + if (actualAbove == null) this.actor.lower_bottom(); else - this.actor.raise(this._stackAbove); + this.actor.raise(actualAbove); }, destroy: function () { diff --git a/js/ui/workspaceThumbnail.js b/js/ui/workspaceThumbnail.js index 540f3d30d..4537b92c6 100644 --- a/js/ui/workspaceThumbnail.js +++ b/js/ui/workspaceThumbnail.js @@ -62,12 +62,35 @@ const WindowClone = new Lang.Class({ this.inDrag = false; }, + // Find the actor just below us, respecting reparenting done + // by DND code + getActualStackAbove: function() { + if (this._stackAbove == null) + return null; + + if (this.inDrag) { + if (this._stackAbove._delegate) + return this._stackAbove._delegate.getActualStackAbove(); + else + return null; + } else { + return this._stackAbove; + } + }, + setStackAbove: function (actor) { this._stackAbove = actor; - if (this._stackAbove == null) + + // Don't apply the new stacking now, it will be applied + // when dragging ends and window are stacked again + if (actor.inDrag) + return; + + let actualAbove = this.getActualStackAbove(); + if (actualAbove == null) this.actor.lower_bottom(); else - this.actor.raise(this._stackAbove); + this.actor.raise(actualAbove); }, destroy: function () {